from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from meiduo_mall.utils.views import LoginRequiredJsonMixin
# Create your views here.

from orders.models import OrderInfo

from alipay import AliPay

from django.conf import settings
import os

from .models import Payment

# 支付接口1：获取扫码支付页面链接
class PaymentView(LoginRequiredJsonMixin, View):

    def get(self, request, order_id):

        try:
            order = OrderInfo.objects.get(pk=order_id)
        except OrderInfo.DoesNotExist as e:
            return JsonResponse({'code': 400, 'errmsg': '订单无效'})

        # TODO: 获取支付页面链接
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None, # 支付宝主动请求美多商城告知支付成功与否
            # 美多私钥文件路径
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'),
            # 支付宝公钥文件路径
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/payment/keys/alipay_public_key.pem'),
            sign_type='RSA2', # 加密方式，默认就是RSA2
            debug=settings.ALIPAY_DEBUG, # debug模式设置为True，如有错误会有错误提示
        )

        # 构造支付页面url
        # api_alipay_trade_page_pay用于构造支付页面链接的查询字符串数据
        query_param = alipay.api_alipay_trade_page_pay(
            subject='美多商城订单：%s，支付'%order_id,
            out_trade_no=order_id, # 把美多商城订单号传递给支付宝
            total_amount=float(order.total_amount), # 支付宝接口要求传入普通浮点数
            return_url=settings.ALIPAY_RETURN_URL, # 该url，用作用户支付成功之后请求回美多商城的地址
        )

        # 完整的url拼接
        # 'https://openapi.alipaydev.com/gateway.do?xxxxxxxxxxxx'
        alipay_url = settings.ALIPAY_URL + '?' + query_param

        return JsonResponse({'code': 0, 'errmsg': 'ok', 'alipay_url': alipay_url})


# 支付接口2：校验支付参数，保存支付结果
class PaymentStatusView(View):

    def put(self, request):
        # 1、提取参数
        # request.GET --> QueryDict类型
        data = request.GET.dict() # 把QueryDict转化为普通字典类型
        # 提取签名sign
        sign = data.pop('sign') # 提取sign签名，并且把签名从字典参数中剔除

        # 2、调用支付宝接口，实现参数的校验
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 支付宝主动请求美多商城告知支付成功与否
            # 美多私钥文件路径
            app_private_key_path=os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'),
            # 支付宝公钥文件路径
            alipay_public_key_path=os.path.join(settings.BASE_DIR, 'apps/payment/keys/alipay_public_key.pem'),
            sign_type='RSA2',  # 加密方式，默认就是RSA2
            debug=settings.ALIPAY_DEBUG,  # debug模式设置为True，如有错误会有错误提示
        )

        result = alipay.verify(data, sign)
        if not result:
            # 参数校验失败
            return JsonResponse({'code': 400, 'errmsg': '支付失败！'})

        order_id = data.get('out_trade_no') # 美多商城订单号
        trade_no = data.get('trade_no') # 支付宝流水号

        # 保存该订单的支付结果
        Payment.objects.create(
            order_id = order_id,
            trade_id = trade_no
        )

        # 修改订单状态
        order = OrderInfo.objects.get(pk=order_id)
        order.status = OrderInfo.ORDER_STATUS_ENUM['UNSEND']
        order.save()

        return JsonResponse({'code': 0, 'errmsg': 'ok', 'trade_id': trade_no})




